package p10selfFilter;

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.Filter;
import org.apache.lucene.util.OpenBitSet;

import java.io.IOException;

/**
 * 权限过滤其实也可以放在这里做，
 * 获取登陆的用户，然后根据不同的权限，filter 不同的数据
 * 下面的delIds 是硬编码，我们可以创建一个工具 类，，比如 accese 把要删除的
 * id 放入其中，通过MyFilter 的构造方法传进来，然后在getDocIdSet 中使用，
 * 我们在实际使用中 MyFilter 应该设置成单列的，防止频繁创建
 */
public class MyFilter extends Filter {
    String [] delIds={"1","2"};
    @Override
    public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
        //这里面要放多少个元素，reader.maxDoc(也就是索引条数)
        // 原理大概是 是一个竖着的表格，0，1，1，1，0 这样的，过滤器的原理是
        //就是找到要过滤的 元素在表格中的位置，然后 把其 值设为0 或1

        //这个 set 一创建，默认里面所有元素都是0 所以这时如果不处理，默认返回这个
        //set 的话，也就意味着所有元素都查不出来。。
        OpenBitSet set=new OpenBitSet(reader.maxDoc());
        //比如，set.set(10); 这个意思就是，把docId（是索引的id 不是我们业务数据的id）为
        //10 的位置 设置为 1，（也就是能查到了） ，如果我们 希望所有的都能查到的话,就用下面的方法
        //也就是从0 开始，一直到 reader.maxDoc() 都设置为1，我们先让所有的元素都能查到，让后过滤
        set.set(0,reader.maxDoc());
        //2，获取我们业务id 所在的doc的位置，并且将其设置为0
        int [] docs=new int[1];
        int [] freqs=new int[1];
        for(String id:delIds){
            TermDocs tds=reader.termDocs(new Term("id",id));
            //会将查询出来的位置，存在 docs 中，出现的频率存储在 freqs 中，所以我们要定义这两个变量
            //返回值count 是获取的条数，因为是id 所以只有一条，如果是其他的话可能有多条，
            //所以docs,freqs 也要定义多条
            int count=tds.read(docs,freqs);
            //然后把对应位置，移除掉
            set.clear(docs[1]);
        }



        return null;
    }
}
